#include "Case_private.h"

Case* newCase(Plateau* plateau){
	Case* c;
	
	c = emalloc(sizeof(Case));
	if(c == NULL) return NULL;
	
	caseSetType(c,tcUndefined);
	caseSetPlateau(c,plateau);
	
	return c;
}

/* Destructor */
void deleteCase(Case* c){
	eassert(c != NULL);
	
	if(c->free)
		c->free(c);
	free(c);
}

/* Getters */
TypeCase caseGetType(Case* c){
	if(c == NULL) return tcUndefined;
	
	return c->type;
}

Plateau* caseGetPlateau(Case* c){
	if(c == NULL) return NULL;
	
	return c->plateau;
}

void* caseGetExt(Case* c){
	if(c == NULL) return NULL;
	
	return c->ext;
}

List* caseGetPersos(Case* c){
	eassert(c != NULL);
	
	if(c == NULL) return NULL;
	
	return c->persos;
}

/* Shortcuts */
Jeu* caseGetJeu(Case* c){
	if(c == NULL) return NULL;
	
	return plateauGetJeu(caseGetPlateau(c));
}

/* Settlers */
void caseSetType(Case* c,TypeCase type){
	if(c == NULL) return;
	
	c->type = type;
}

void caseSetPlateau(Case* c,Plateau* plateau){
	if(c == NULL) return;
	eassert(c != NULL);
	
	c->plateau = plateau;
	
	if(plateau != NULL && !plateauHasCase(plateau,c)){
		plateauAddDebutCase(plateau,c);
	}

}

void caseSetPersos(Case* c,List* persos){
	eassert(c != NULL);
	
	c->persos = persos;
}

/* fonctions virtuelles */
int caseExecuter(Case* c){
	if(c == NULL) return 0;
	
	if(c->executer)
		return c->executer(c);
	
	/* Par défaut on ne fait rien */
	return 1;
}

int caseExecuterSortie(Case* c){
	if(c == NULL) return 0;
	
	if(c->executerSortie)
		return c->executerSortie(c);
	
	/* Par défaut on ne fait rien */
	return 1;
}

int caseEnleverPerso(Case* c,Personnage* perso){
	eassert(c != NULL);
	eassert(perso != NULL);
	
	if(listRem(caseGetPersos(c),perso) == NULL) return 0;
	return 1;
}

int caseGetNbPersos(Case* c){
	eassert(c != NULL);
	
	return listGetSize(caseGetPersos(c));
}
